package com.marinesky.mstools.codec;/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         佛祖保佑       永无BUG
*/
//          佛曰:
//                  写字楼里写字间，写字间里程序员；    
//                  程序人员写程序，又拿程序换酒钱。    
//                  酒醒只在网上坐，酒醉还来网下眠；    
//                  酒醉酒醒日复日，网上网下年复年。    
//                  但愿老死电脑间，不愿鞠躬老板前；    
//                  奔驰宝马贵者趣，公交自行程序员。    
//                  别人笑我忒疯癫，我笑自己命太贱；    
//                  不见满街漂亮妹，哪个归得程序员？
import com.marinesky.mstools.common.Constant;
import org.apache.commons.lang.StringUtils;

import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.security.MessageDigest;

public class MD5Util {



    /**
     * md5加密
     * @param inEncodeBytes
     * @return 返回加密后的数组
     */
    public static byte[] encodeMD5Bytes(byte[] inEncodeBytes){
        byte[] outEncodeBytes=null;
        try {
            if (inEncodeBytes==null || inEncodeBytes.length==0){
                throw new NullPointerException("the inEncodeBytes is null or length is 0");
            }
            MessageDigest messageDigest=MessageDigest.getInstance(Constant.CodecType.CODE_MD5);
            messageDigest.update(inEncodeBytes);
            outEncodeBytes=messageDigest.digest();
        } catch (Exception e){
            e.printStackTrace();
        }
        return outEncodeBytes;
    }


    /**
     * md5加密
     * @param inEncodeStr
     * @return 返回加密后的数组
     */
    public static byte[] encodeMD5Bytes(String inEncodeStr){
        byte[] outEncodeBytes=null;
        try {
            return  encodeMD5Bytes(inEncodeStr,Constant.Charset.UTF8);
        } catch (Exception e){
            e.printStackTrace();
        }
        return outEncodeBytes;
    }


    /**
     * md5加密
     * @param inEncodeStr
     * @param charset
     * @return 返回加密后的数组
     */
    public static byte[] encodeMD5Bytes(String inEncodeStr,String charset){
        byte[] outEncodeBytes=null;
        try {
            if(StringUtils.isBlank(inEncodeStr)){
                throw new IllegalArgumentException(" the inEncodeStr is null or is empty ");
            }
            if(StringUtils.isBlank(charset) || !Charset.isSupported(charset)){
                throw new IllegalArgumentException(" the charset is blank or not support! ");
            }

            byte[] inEncodeBytes=inEncodeStr.getBytes(charset);

            outEncodeBytes=encodeMD5Bytes(inEncodeBytes);
        } catch (Exception e){
            e.printStackTrace();
        }
        return outEncodeBytes;
    }


    /**
     * MD5加密,默认使用utf-8字符集
     * @param inEncodeStr
     * @return
     */
    public static String encodeMD5(String inEncodeStr){
        return  encodeMD5(inEncodeStr,Constant.Charset.UTF8);
    }

    /**
     * MD5加密
     * @param inEncodeStr
     * @param charset
     * @return
     */
    public static String encodeMD5(String inEncodeStr,String charset){
        String result=null;
        try{

            byte[] outEncodeBytes=encodeMD5Bytes(inEncodeStr,charset);

            result=CodecUtil.bytesToHexString(outEncodeBytes);

        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }


    /**
     * md5加密
     * @param byteBuffer
     * @return 返回加密后的数组
     */
    public static byte[] encodeMD5Bytes(ByteBuffer byteBuffer){
        byte[] outEncodeBytes=null;
        try {
            if (byteBuffer==null){
                throw new NullPointerException("the byteBuffer is null !");
            }
            MessageDigest messageDigest=MessageDigest.getInstance(Constant.CodecType.CODE_MD5);
            messageDigest.update(byteBuffer);
            outEncodeBytes=messageDigest.digest();
        } catch (Exception e){
            e.printStackTrace();
        }
        return outEncodeBytes;
    }


    /**
     * md5加密
     * @param byteBuffer
     * @return 返回加密后的数组
     */
    public static String encodeMD5(ByteBuffer byteBuffer){
        String result=null;
        try {
            byte[] outEncodeBytes=encodeMD5Bytes(byteBuffer);
            result=CodecUtil.bytesToHexString(outEncodeBytes);
        } catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
}
